/* main.c */
#include <stdio.h>  // 包含标准输入输出库，用于基本的输入输出操作
#include <stdlib.h> // 包含标准库，用于内存分配等操作
#include <string.h> // 包含字符串操作库，用于字符串处理
#include <unistd.h> // 包含unistd库，用于系统调用

#include "garbage.h"    // 包含自定义的垃圾回收库，用于内存管理
#include "serialTest.h" // 包含自定义的串口工具库，用于串口通信

/*判断进程是否在运行*/
static int detect_process(const char *process_name)
{
    int n = -1;
    FILE *strm;
    char buf[128] = {0};

    // 构造命令字符串，通过ps命令查找进程
    sprintf(buf, "ps -ax | grep %s|grep -v grep", process_name);
    // 使用popen执行命令并读取输出
    if ((strm = popen(buf, "r")) != NULL)
    {
        if (fgets(buf, sizeof(buf), strm) != NULL)
        {
            n = atoi(buf); // 将进程ID字符串转换为整数
        }
    }
    else
    {
        return -1; // popen失败
    }
    pclose(strm); // 关闭popen打开的文件流

    return n;
}

int main(int argc, char **argv)
{
    int ret;                                                        // 函数返回值
    int len = 0;                                                    // 串口数据长度
    int serial_fd;                                                  // 串口文件描述符
    unsigned char buffer[6] = {0xAA, 0x55, 0x00, 0x00, 0x55, 0xAA}; // 发送数据
    char *category = NULL;                                          // 垃圾分类结果

    garbage_init(); // 初始化垃圾分类器

    ret = detect_process("mjpg_streamer"); // 检测mjpg_streamer是否在运行
    if (ret == -1)
    {
        printf("USB摄像头未连接或mjpg_streamer未启动\n");
        goto END; // 未启动则退出
    }

    serial_fd = mySerialOpen(SERIAL_DEV, SERIAL_BAUD); // 打开串口
    if (serial_fd == -1)
    {
        printf("打开串口失败\n");
        goto END; // 打开串口失败则退出
    }

    while (1)
    {
        len = mySerialReadString(serial_fd, buffer); // 读取串口数据
        // printf("len = %d, buffer[2] = 0x%x\n", len, buffer[2]); // 打印串口数据
        printf("len = %d, buffer = %x %x %x %x %x %x\n", len, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
        if (len > 0 && buffer[2] == 0x46)
        {
            buffer[2] = 0x00; // 置0x46为0x00
            printf("使用wget拍照中...\n");
            system(WGET_CMD); // 执行wget命令拍照
            printf("拍照完成\n");

            if (access(GARBAGE_FILE, F_OK) == 0)
            {                                          // 判断垃圾分类文件是否存在
                category = garbage_category(category); // 分类垃圾
                if (strstr(category, "干垃圾"))
                {
                    buffer[2] = 0x41; // 识别为干垃圾
                    printf("len = %d, buffer = %x %x %x %x %x %x\n", len, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
                }
                else if (strstr(category, "湿垃圾"))
                {
                    buffer[2] = 0x42; // 识别为湿垃圾
                    printf("len = %d, buffer = %x %x %x %x %x %x\n", len, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
                }
                else if (strstr(category, "可回收垃圾"))
                {
                    buffer[2] = 0x43; // 识别为可回收垃圾
                    printf("len = %d, buffer = %x %x %x %x %x %x\n", len, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
                }
                else if (strstr(category, "有害垃圾"))
                {
                    buffer[2] = 0x44; // 识别为有害垃圾
                    printf("len = %d, buffer = %x %x %x %x %x %x\n", len, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
                }
                else
                {
                    buffer[2] = 0x45; // 未识别到垃圾类型
                    printf("len = %d, buffer = %x %x %x %x %x %x\n", len, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
                }
            }
            else
            {
                buffer[2] = 0x45; // 识别失败
                printf("len = %d, buffer = %x %x %x %x %x %x\n", len, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
            }
            // 发送分类结果到串口
            mySerialSendString(serial_fd, buffer, 6); // 发送数据
            buffer[2] = 0x00;                         // 置0x00为0x46
            remove(GARBAGE_FILE);                     // 删除垃圾分类文件
        }
    }

END:
    garbage_destroy(); // 销毁垃圾分类器

    return 0;
}
